$(document).ready(() => {
    // Функция для применения цвета к имени
    function applyColorToUserName(element) {
        let userName = $(element).text().trim();
        if (userName) {
            let color = getColorFromNameV2(userName);
            $(element).attr('style', 'color: ' + color + ' !important;');
        }
    }

    // Функция для обработки всех существующих имён
    function processAllUserNames() {
        $('.chat-widget .comment-wrapper .comment .title .text, ' +
          'body > .comments-tree-wrapper .comment .title .text, ' +
          '.gc-comment .comment .title .text').each((i, user_name) => {
            applyColorToUserName(user_name);
        });
    }

    // Создаём наблюдатель за изменениями в DOM
    const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
            // Проверяем добавленные узлы
            if (mutation.addedNodes.length) {
                mutation.addedNodes.forEach((node) => {
                    // Если добавлен элемент с комментарием
                    if ($(node).hasClass('gc-comment') || 
                        $(node).hasClass('comment') || 
                        $(node).find('.comment .title .text').length) {
                        
                        // Ищем имена в новом комментарии
                        $(node).find('.comment .title .text').each((i, user_name) => {
                            applyColorToUserName(user_name);
                        });
                    }
                    
                    // Проверяем, может это сам элемент с именем
                    if ($(node).hasClass('text') && 
                        $(node).closest('.title').length) {
                        applyColorToUserName(node);
                    }
                });
            }
            
            // Также проверяем изменения в атрибутах (на случай динамической подгрузки)
            if (mutation.type === 'attributes' && 
                $(mutation.target).hasClass('text') && 
                $(mutation.target).closest('.title').length) {
                applyColorToUserName(mutation.target);
            }
        });
    });

    // Настройки наблюдателя
    const observerConfig = {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['class']
    };

    // Запускаем наблюдение за всем документом
    observer.observe(document.body, observerConfig);

    // Обрабатываем существующие комментарии
    processAllUserNames();

    // Дополнительно: отслеживаем отправку формы комментария
    $(document).on('submit', 'form[action*="/cms/comment/add"]', function() {
        // Даём время на появление нового комментария
        setTimeout(() => {
            // Ищем последний добавленный комментарий
            let $lastComment = $('.gc-comment').last();
            $lastComment.find('.comment .title .text').each((i, user_name) => {
                applyColorToUserName(user_name);
            });
        }, 500);
    });

    // Также отслеживаем клик по кнопке отправки (на случай, если форма не триггерит submit)
    $(document).on('click', '.btn-send', function() {
        setTimeout(() => {
            let $lastComment = $('.gc-comment').last();
            $lastComment.find('.comment .title .text').each((i, user_name) => {
                applyColorToUserName(user_name);
            });
        }, 500);
    });

    // Для платформы GetCourse - отслеживаем создание новых виджетов
    $(document).on('gc:comment:widget:create', function(e, widget) {
        if (widget && widget.$comment) {
            widget.$comment.find('.comment .title .text').each((i, user_name) => {
                applyColorToUserName(user_name);
            });
        }
    });
});

// Ваши функции для генерации цвета (оставляем без изменений)
function getHSLColorFromName(name) {
    let hash = 0;
    for (let i = 0; i < name.length; i++) {
        hash = name.charCodeAt(i) + ((hash << 5) - hash);
    }
    hash = Math.abs(hash);
    const hue = (hash % 360);
    const saturation = 65 + (hash % 20);
    const lightness = 45 + (hash % 15);
    return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
}

function hslToHex(hslString) {
    const matches = hslString.match(/\d+/g);
    if (!matches) return '#000000';
    
    let h = parseInt(matches[0]) / 360;
    let s = parseInt(matches[1]) / 100;
    let l = parseInt(matches[2]) / 100;

    let r, g, b;

    if (s === 0) {
        r = g = b = l;
    } else {
        const hue2rgb = (p, q, t) => {
            if (t < 0) t += 1;
            if (t > 1) t -= 1;
            if (t < 1/6) return p + (q - p) * 6 * t;
            if (t < 1/2) return q;
            if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
            return p;
        };

        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        const p = 2 * l - q;
        r = hue2rgb(p, q, h + 1/3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1/3);
    }

    const toHex = x => {
        const hex = Math.round(x * 255).toString(16);
        return hex.length === 1 ? '0' + hex : hex;
    };

    return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
}

function getColorFromNameV2(name) {
    const hsl = getHSLColorFromName(name);
    return hslToHex(hsl);
}